🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / docs / src / commonMain / kotlin / org / meshtastic / feature / docs / translation / MarkdownTranslationSegmenter.kt
Displaying Raw • Download
feature/docs/src/commonMain/kotlin/org/meshtastic/feature/docs/translation/MarkdownTranslationSegmenter.kt 4d4070c8e1ed73a56ee2f054300a0f62e3fe2e62 (4d4070c8) Text, 14.83 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.docs.translation
T8b949e/**
* Segments markdown into translatable and non-translatable blocks, translates the text portions, and reassembles valid
* markdown.
*
* Preserves:
* - Fenced code blocks (``` or ~~~)
* - Indented code blocks (4+ spaces or tab)
* - Link URLs and image paths (translates link text only)
* - HTML tags
* - Frontmatter (--- delimited YAML)
*
* Translates:
* - Paragraphs, headings, list items, blockquotes, table cell text
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72object T56d364MarkdownTranslationSegmenter Tb4b4b4{
T8b949e/**
* Translate markdown content by extracting text segments, translating them, and reassembling.
*
* @param markdown The source markdown content
* @param translate A suspend function that translates a plain text string
* @return The translated markdown with structure preserved
*/
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72suspend Tff7b72fun Td2a8fftranslateMarkdownTb4b4b4(Te6edf3markdownTb4b4b4: Tffa657StringTb4b4b4, Te6edf3translateTb4b4b4: Te6edf3suspend Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3lines Tff7b72= Te6edf3markdownTb4b4b4.Te6edf3linesTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3StringBuilderTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3i Tff7b72= T79c0ff0
T8b949e// Skip frontmatter
Tff7b72if Tb4b4b4(Te6edf3linesTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3linesTff7b72[T79c0ff0Tff7b72]Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ff---Ta5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3linesTff7b72[T79c0ff0Tff7b72]Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff1
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3linesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4) Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ff---Ta5d6ff"Tb4b4b4) Tb4b4b4{
Te6edf3iTff7b72+Tff7b72+
Tff7b72break
Tb4b4b4}
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3linesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3line Tff7b72= Te6edf3linesTff7b72[Te6edf3iTff7b72]
Tff7b72when Tb4b4b4{
T8b949e// Fenced code block
Te6edf3isFencedCodeStartTb4b4b4(Te6edf3lineTb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3fence Tff7b72= Te6edf3extractFenceTb4b4b4(Te6edf3lineTb4b4b4)
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3lineTb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3linesTb4b4b4.Te6edf3size Tff7b72&Tff7b72& Tff7b72!Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Te6edf3fenceTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3i Tff7b72< Te6edf3linesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
T8b949e// Indented code block (4 spaces or tab, and previous line is blank or start)
Te6edf3isIndentedCodeTb4b4b4(Te6edf3lineTb4b4b4) Tff7b72&Tff7b72& Tb4b4b4(Te6edf3i Tff7b72=Tff7b72= T79c0ff0 Tff7b72|Tff7b72| Te6edf3linesTff7b72[Te6edf3i Tff7b72- T79c0ff1Tff7b72]Tb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72while Tb4b4b4(Te6edf3i Tff7b72< Te6edf3linesTb4b4b4.Te6edf3size Tff7b72&Tff7b72& Tb4b4b4(Te6edf3isIndentedCodeTb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4) Tff7b72|Tff7b72| Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3linesTff7b72[Te6edf3iTff7b72]Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
T8b949e// HTML block (starts with <)
Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<Ta5d6ff"Tb4b4b4) Tff7b72&Tff7b72& Te6edf3isHtmlBlockTb4b4b4(Te6edf3lineTb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3lineTb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Empty line
Te6edf3lineTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3lineTb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Heading (ATX: # followed by space or end-of-line)
Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3matchesTb4b4b4(Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff^#{1,6}(Ta5d6ff\\Ta5d6ffs.*|$Ta5d6ff)Ta5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3headingPrefix Tff7b72=
Te6edf3lineTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3lineTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff'#'Tb4b4b4)Tb4b4b4) Tff7b72+
Te6edf3lineTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3lineTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff'#'Tb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3takeWhile Tb4b4b4{ Tffa657it Tff7b72=Tff7b72= Ta5d6ff'#' Tb4b4b4} Tff7b72+
Ta5d6ff"Ta5d6ff Ta5d6ff"
Tff7b72val Te6edf3text Tff7b72= Te6edf3lineTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3headingPrefixTb4b4b4.Te6edf3lengthTb4b4b4)
Tff7b72val Te6edf3translated Tff7b72= Tff7b72if Tb4b4b4(Te6edf3textTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3translateTb4b4b4(Te6edf3textTb4b4b4) Tff7b72else Te6edf3text
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Ta5d6ff"Tffd700$Te6edf3headingPrefixTffd700$Te6edf3translatedTa5d6ff"Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Blockquote
Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff>Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3stripped Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff>Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3indent Tff7b72= Te6edf3lineTb4b4b4.Te6edf3takeWhile Tb4b4b4{ Tffa657it Tff7b72!Tff7b72= Ta5d6ff'>' Tb4b4b4}
Tff7b72val Te6edf3translated Tff7b72= Tff7b72if Tb4b4b4(Te6edf3strippedTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3translateTb4b4b4(Te6edf3strippedTb4b4b4) Tff7b72else Te6edf3stripped
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Ta5d6ff"Tffd700$Te6edf3indentTa5d6ff> Tffd700$Te6edf3translatedTa5d6ff"Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// List item (unordered or ordered)
Te6edf3isListItemTb4b4b4(Te6edf3lineTb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Tb4b4b4(Te6edf3listPrefixTb4b4b4, Te6edf3textTb4b4b4) Tff7b72= Te6edf3splitListItemTb4b4b4(Te6edf3lineTb4b4b4)
Tff7b72val Te6edf3translatedText Tff7b72= Te6edf3translateInlineMarkdownTb4b4b4(Te6edf3textTb4b4b4, Te6edf3translateTb4b4b4)
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Ta5d6ff"Tffd700$Te6edf3listPrefixTffd700$Te6edf3translatedTextTa5d6ff"Tb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Table row
Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3isTableSeparatorTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3lineTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72val Te6edf3translated Tff7b72= Te6edf3translateTableRowTb4b4b4(Te6edf3lineTb4b4b4, Te6edf3translateTb4b4b4)
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3translatedTb4b4b4)
Tb4b4b4}
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
T8b949e// Regular paragraph text
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3translated Tff7b72= Te6edf3translateInlineMarkdownTb4b4b4(Te6edf3lineTb4b4b4, Te6edf3translateTb4b4b4)
Te6edf3resultTb4b4b4.Te6edf3appendLineTb4b4b4(Te6edf3translatedTb4b4b4)
Te6edf3iTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Remove trailing newline added by appendLine on last line
Tff7b72return Te6edf3resultTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3trimEndTb4b4b4(Ta5d6ff'\n'Tb4b4b4)
Tb4b4b4}
T8b949e/** Translate text while preserving inline markdown elements like links, images, and inline code. */
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffCyclomaticComplexMethodTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8fftranslateInlineMarkdownTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4, Te6edf3translateTb4b4b4: Te6edf3suspend Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3textTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return Te6edf3text
Tff7b72val Te6edf3segments Tff7b72= Te6edf3mutableListOfTff7b72<Te6edf3SegmentTff7b72>Tb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3pos Tff7b72= T79c0ff0
Tff7b72while Tb4b4b4(Te6edf3pos Tff7b72< Te6edf3textTb4b4b4.Te6edf3lengthTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4{
T8b949e// Inline code
Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'`' Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3end Tff7b72= Te6edf3textTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff'`'Tb4b4b4, Te6edf3pos Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3end Tff7b72> Te6edf3posTb4b4b4) Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3VerbatimTb4b4b4(Te6edf3textTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3posTb4b4b4, Te6edf3end Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3pos Tff7b72= Te6edf3end Tff7b72+ T79c0ff1
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72]Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
T8b949e// Image: 
Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'!' Tff7b72&Tff7b72& Te6edf3pos Tff7b72+ T79c0ff1 Tff7b72< Te6edf3textTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3textTff7b72[Te6edf3pos Tff7b72+ T79c0ff1Tff7b72] Tff7b72=Tff7b72= Ta5d6ff'[' Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3closeBracket Tff7b72= Te6edf3textTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff']'Tb4b4b4, Te6edf3pos Tff7b72+ T79c0ff2Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3closeBracket Tff7b72> Te6edf3pos Tff7b72&Tff7b72& Te6edf3closeBracket Tff7b72+ T79c0ff1 Tff7b72< Te6edf3textTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3textTff7b72[Te6edf3closeBracket Tff7b72+ T79c0ff1Tff7b72] Tff7b72=Tff7b72= Ta5d6ff'('Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3closeParen Tff7b72= Te6edf3textTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff')'Tb4b4b4, Te6edf3closeBracket Tff7b72+ T79c0ff2Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3closeParen Tff7b72> Te6edf3closeBracketTb4b4b4) Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3VerbatimTb4b4b4(Te6edf3textTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3posTb4b4b4, Te6edf3closeParen Tff7b72+ T79c0ff1Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3pos Tff7b72= Te6edf3closeParen Tff7b72+ T79c0ff1
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72]Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72]Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
T8b949e// Link: [text](url)
Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'[' Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3closeBracket Tff7b72= Te6edf3textTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff']'Tb4b4b4, Te6edf3pos Tff7b72+ T79c0ff1Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3closeBracket Tff7b72> Te6edf3pos Tff7b72&Tff7b72& Te6edf3closeBracket Tff7b72+ T79c0ff1 Tff7b72< Te6edf3textTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3textTff7b72[Te6edf3closeBracket Tff7b72+ T79c0ff1Tff7b72] Tff7b72=Tff7b72= Ta5d6ff'('Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3closeParen Tff7b72= Te6edf3textTb4b4b4.Te6edf3indexOfTb4b4b4(Ta5d6ff')'Tb4b4b4, Te6edf3closeBracket Tff7b72+ T79c0ff2Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3closeParen Tff7b72> Te6edf3closeBracketTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3linkText Tff7b72= Te6edf3textTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3pos Tff7b72+ T79c0ff1Tb4b4b4, Te6edf3closeBracketTb4b4b4)
Tff7b72val Te6edf3url Tff7b72= Te6edf3textTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3closeBracket Tff7b72+ T79c0ff2Tb4b4b4, Te6edf3closeParenTb4b4b4)
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3LinkTb4b4b4(Te6edf3linkTextTb4b4b4, Te6edf3urlTb4b4b4)Tb4b4b4)
Te6edf3pos Tff7b72= Te6edf3closeParen Tff7b72+ T79c0ff1
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72]Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72]Tb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Tb4b4b4}
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
T8b949e// Accumulate regular text
Tff7b72val Te6edf3start Tff7b72= Te6edf3pos
Tff7b72while Tb4b4b4(Te6edf3pos Tff7b72< Te6edf3textTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Tff7b72!Te6edf3isInlineMarkerTb4b4b4(Te6edf3textTb4b4b4, Te6edf3posTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3posTff7b72+Tff7b72+
Tb4b4b4}
Te6edf3segmentsTb4b4b4.Te6edf3addTb4b4b4(Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTb4b4b4(Te6edf3textTb4b4b4.Te6edf3substringTb4b4b4(Te6edf3startTb4b4b4, Te6edf3posTb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Translate all translatable segments
Tff7b72return Te6edf3segments
Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4{ Te6edf3segment Tff7b72-Tff7b72>
Tff7b72when Tb4b4b4(Te6edf3segmentTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Verbatim Tff7b72-Tff7b72> Te6edf3segmentTb4b4b4.Te6edf3text
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Translatable Tff7b72-Tff7b72>
Tff7b72if Tb4b4b4(Te6edf3segmentTb4b4b4.Te6edf3textTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e// We can't suspend in joinToString, so we pre-translate below
Te6edf3segmentTb4b4b4.Te6edf3text
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3segmentTb4b4b4.Te6edf3text
Tb4b4b4}
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Link Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff[Tffd700${Te6edf3segmentTb4b4b4.Te6edf3textTffd700}Ta5d6ff](Tffd700${Te6edf3segmentTb4b4b4.Te6edf3urlTffd700}Ta5d6ff)Ta5d6ff"
Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3let Tb4b4b4{ Te6edf3assembled Tff7b72-Tff7b72>
T8b949e// Check if there's anything to translate (text segments or link text)
Tff7b72val Te6edf3translatableText Tff7b72= Te6edf3segmentsTb4b4b4.Te6edf3filterIsInstanceTff7b72<Te6edf3SegmentTb4b4b4.Te6edf3TranslatableTff7b72>Tb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4) Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3text Tb4b4b4}
Tff7b72val Te6edf3hasTranslatableLinks Tff7b72= Te6edf3segmentsTb4b4b4.Te6edf3any Tb4b4b4{ Tffa657it Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Link Tff7b72&Tff7b72& Tffa657itTb4b4b4.Te6edf3textTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3translatableTextTb4b4b4.Te6edf3isBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Tff7b72!Te6edf3hasTranslatableLinksTb4b4b4) Tff7b72returnTf0883e@let Te6edf3assembled
T8b949e// Translate with preserved inline elements (handles both text and link text)
Te6edf3translateWithPreservedInlinesTb4b4b4(Te6edf3segmentsTb4b4b4, Te6edf3translateTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8fftranslateWithPreservedInlinesTb4b4b4(
Te6edf3segmentsTb4b4b4: Te6edf3ListTff7b72<Te6edf3SegmentTff7b72>Tb4b4b4,
Te6edf3translateTb4b4b4: Te6edf3suspend Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4,
Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3StringBuilderTb4b4b4(Tb4b4b4)
T8b949e// Group consecutive translatables, translate them together, preserve verbatim/links
Tff7b72val Te6edf3buffer Tff7b72= Te6edf3StringBuilderTb4b4b4(Tb4b4b4)
Tff7b72for Tb4b4b4(Te6edf3segment Tff7b72in Te6edf3segmentsTb4b4b4) Tb4b4b4{
Tff7b72when Tb4b4b4(Te6edf3segmentTb4b4b4) Tb4b4b4{
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Translatable Tff7b72-Tff7b72> Te6edf3bufferTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3segmentTb4b4b4.Te6edf3textTb4b4b4)
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Verbatim Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3translateTb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3bufferTb4b4b4)
Tb4b4b4}
Te6edf3bufferTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3segmentTb4b4b4.Te6edf3textTb4b4b4)
Tb4b4b4}
Tff7b72is Te6edf3SegmentTb4b4b4.Te6edf3Link Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3translateTb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3bufferTb4b4b4)
Tb4b4b4}
Te6edf3bufferTb4b4b4.Te6edf3clearTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3translatedLinkText Tff7b72= Tff7b72if Tb4b4b4(Te6edf3segmentTb4b4b4.Te6edf3textTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Te6edf3translateTb4b4b4(Te6edf3segmentTb4b4b4.Te6edf3textTb4b4b4) Tff7b72else Te6edf3segmentTb4b4b4.Te6edf3text
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff[Tffd700$Te6edf3translatedLinkTextTa5d6ff](Tffd700${Te6edf3segmentTb4b4b4.Te6edf3urlTffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3translateTb4b4b4(Te6edf3bufferTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3resultTb4b4b4.Te6edf3appendTb4b4b4(Te6edf3bufferTb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3resultTb4b4b4.Te6edf3toStringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72suspend Tff7b72fun Td2a8fftranslateTableRowTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4, Te6edf3translateTb4b4b4: Te6edf3suspend Tb4b4b4(Tffa657StringTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3cells Tff7b72= Te6edf3lineTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4)
Tff7b72val Te6edf3translated Tff7b72=
Te6edf3cellsTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3cell Tff7b72-Tff7b72>
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3cellTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3trimmedTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Ta5d6ff"Ta5d6ff Tffd700${Te6edf3translateTb4b4b4(Te6edf3trimmedTb4b4b4)Tffd700}Ta5d6ff Ta5d6ff" Tff7b72else Te6edf3cell
Tb4b4b4}
Tff7b72return Te6edf3translatedTb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffisFencedCodeStartTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff```Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff~~~Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffisInlineMarkerTb4b4b4(Te6edf3textTb4b4b4: Tffa657StringTb4b4b4, Te6edf3posTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'`' Tff7b72|Tff7b72| Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'[' Tff7b72|Tff7b72| Tb4b4b4(Te6edf3textTff7b72[Te6edf3posTff7b72] Tff7b72=Tff7b72= Ta5d6ff'!' Tff7b72&Tff7b72& Te6edf3pos Tff7b72+ T79c0ff1 Tff7b72< Te6edf3textTb4b4b4.Te6edf3length Tff7b72&Tff7b72& Te6edf3textTff7b72[Te6edf3pos Tff7b72+ T79c0ff1Tff7b72] Tff7b72=Tff7b72= Ta5d6ff'['Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffextractFenceTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3fenceChar Tff7b72= Te6edf3trimmedTff7b72[T79c0ff0Tff7b72]
Tff7b72return Te6edf3trimmedTb4b4b4.Te6edf3takeWhile Tb4b4b4{ Tffa657it Tff7b72=Tff7b72= Te6edf3fenceChar Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffisIndentedCodeTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72= Te6edf3lineTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3lineTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6fftTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffisHtmlBlockTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3lowercaseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<divTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff</divTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<tableTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<preTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<!--Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<brTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff<hrTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffisListItemTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tb4b4b4{
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff- Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff* Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff+ Ta5d6ff"Tb4b4b4) Tff7b72|Tff7b72|
Te6edf3ORDERED_LIST_REGEXTb4b4b4.Te6edf3containsMatchInTb4b4b4(Te6edf3trimmedTb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffsplitListItemTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3PairTff7b72<Tffa657StringTb4b4b4, Tffa657StringTff7b72> Tb4b4b4{
Tff7b72val Te6edf3leadingWhitespace Tff7b72= Te6edf3lineTb4b4b4.Te6edf3takeWhile Tb4b4b4{ Tffa657it Tff7b72=Tff7b72= Ta5d6ff' ' Tff7b72|Tff7b72| Tffa657it Tff7b72=Tff7b72= Ta5d6ff'\t' Tb4b4b4}
Tff7b72val Te6edf3trimmed Tff7b72= Te6edf3lineTb4b4b4.Te6edf3trimStartTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72when Tb4b4b4{
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff- Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3PairTb4b4b4(Ta5d6ff"Tffd700$Te6edf3leadingWhitespaceTa5d6ff- Ta5d6ff"Tb4b4b4, Te6edf3trimmedTb4b4b4.Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff- Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff* Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3PairTb4b4b4(Ta5d6ff"Tffd700$Te6edf3leadingWhitespaceTa5d6ff* Ta5d6ff"Tb4b4b4, Te6edf3trimmedTb4b4b4.Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff* Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3trimmedTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ff+ Ta5d6ff"Tb4b4b4) Tff7b72-Tff7b72> Te6edf3PairTb4b4b4(Ta5d6ff"Tffd700$Te6edf3leadingWhitespaceTa5d6ff+ Ta5d6ff"Tb4b4b4, Te6edf3trimmedTb4b4b4.Te6edf3removePrefixTb4b4b4(Ta5d6ff"Ta5d6ff+ Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72else Tff7b72-Tff7b72> Tb4b4b4{
Tff7b72val Te6edf3match Tff7b72= Te6edf3ORDERED_LIST_REGEXTb4b4b4.Te6edf3findTb4b4b4(Te6edf3trimmedTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3match Tff7b72!Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3PairTb4b4b4(Ta5d6ff"Tffd700$Te6edf3leadingWhitespaceTffd700${Te6edf3matchTb4b4b4.Te6edf3valueTffd700}Ta5d6ff"Tb4b4b4, Te6edf3trimmedTb4b4b4.Te6edf3removePrefixTb4b4b4(Te6edf3matchTb4b4b4.Te6edf3valueTb4b4b4)Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3PairTb4b4b4(Te6edf3leadingWhitespaceTb4b4b4, Te6edf3trimmedTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72private Tff7b72fun Td2a8ffisTableSeparatorTb4b4b4(Te6edf3lineTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Tffa657Boolean Tff7b72=
Te6edf3lineTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff|Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff-Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff:Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)
Tff7b72private Tff7b72sealed Tff7b72class T56d364Segment Tb4b4b4{
Tff7b72data Tff7b72class T56d364TranslatableTb4b4b4(Tff7b72val Te6edf3textTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4: Te6edf3SegmentTb4b4b4(Tb4b4b4)
Tff7b72data Tff7b72class T56d364VerbatimTb4b4b4(Tff7b72val Te6edf3textTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4: Te6edf3SegmentTb4b4b4(Tb4b4b4)
Tff7b72data Tff7b72class T56d364LinkTb4b4b4(Tff7b72val Te6edf3textTb4b4b4: Tffa657StringTb4b4b4, Tff7b72val Te6edf3urlTb4b4b4: Tffa657StringTb4b4b4) Tb4b4b4: Te6edf3SegmentTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72private Tff7b72val Te6edf3ORDERED_LIST_REGEX Tff7b72= Te6edf3RegexTb4b4b4(Ta5d6ff"Ta5d6ff^Ta5d6ff\\Ta5d6ffd+[.)]+Ta5d6ff\\Ta5d6ffsTa5d6ff"Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.11s